import java.util.Arrays;

//数组的练习
public class Test {
    public static void main(String[] args) {
        //数组各值翻倍
        int[] array = {1,2,3,4,5,6};
        int[] array1 = transform(array);
        System.out.println(Arrays.toString(array1));
//        transform(array);
//        System.out.println(Arrays.toString(array));
        //使数组前为奇数，后为偶数
        ofea(array);
        System.out.println(Arrays.toString(array));
        //数组中两数之和等于某一个值，输出这两数的下标值
        int[] array2 = {1,2,3,4,5};
        int[] arr = func1(array2,5);
        System.out.println(Arrays.toString(arr));
        //找出数组中唯一一个单数
        int[] array3 = {1,2,3,1,2};
        System.out.println(func2(array3));
        //找出数组中出现次数大于n/2的元素
        //1.取巧的方式
        int[] array4 = {1,2,2,2,1,1,2,2};
        System.out.println(majorityElement(array4));
        //2.投票法
        System.out.println(majorityElement1(array4));

        //存在连续的三个奇数，判断数组中是否存在三个连续都是奇数的情况，存在true，不存在false
        int[] array5 = {1,2,3,5,7,8,9};
        System.out.println(func4(array5));
    }

    //数组各值翻倍
    public static int[] transform(int[] array){
        int[] array1 = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            array1[i] = array[i] * 2;
        }
        return array1;
    }
//    public static void transform(int[] array){
//        for (int i = 0; i < array.length; i++) {
//            array[i] *= 2;
//        }
//    }

    //数组奇数在前，偶数在后
    //方法一
    public static void ofea(int[] array){
        int left = 0;
        int right = array.length - 1;
        while(left < right){
            if(array[left] % 2 != 1){
                if(array[right] % 2 != 0){
                    int tmp = array[left];
                    array[left] = array[right];
                    array[right] = tmp;
                }else {
                    right--;
                }
            }else {
                left++;
            }
        }
    }

    //方法二
//    public static void ofea(int[] array){
//        int left = 0;
//        int right = array.length - 1;
//        while(left < right){
//            while(left < right && array[left] % 2 != 1){
//                left++;
//            }
//            while(left < right && array[right] % 2 != 0){
//                right--;
//            }
//            int tmp = array[left];
//            array[left] = array[right];
//            array[right] = tmp;
//        }
//    }

    //数组中两数之和等于某一个值，输出这两数的下标值
    public static int[] func1(int[] array,int num){
        int[] arr = new int[2];
        for(int i = 0;i < array.length-1;i++){
            int a = array[i];
            for(int j = i+1;j < array.length;j++){
                int b = array[j];
                if(num == a + b){
                    arr[0] = i;
                    arr[1] = j;
                    return arr;
                }
            }
        }
        return arr;
    }

    //寻找到数组中唯一单次出现的数
    public static int func2(int[] array){
        int ret = 0;
        for (int i = 0; i < array.length; i++) {
            ret ^= array[i];
        }
        return ret;
    }

    //找出数组中出现次数大于n/2的元素
    //1.取巧的方式
    public static int majorityElement(int[] array){
        Arrays.sort(array);
        return array[array.length/2];
    }

    //2.投票法
    public static int majorityElement1(int[] array){
        int ret = array[0];
        int count = 0;
        for (int i = 1; i < array.length; i++) {
            if(ret == array[i]){
                count++;
            }else {
                count--;
            }
            if(count == 0){
                ret = array[i+1];
            }
        }
        return ret;
    }

    //判断数组中是否存在连续的三个奇数
    public static boolean func4(int[] array){
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[i] % 2 != 0){
                count++;
            }else {
                count = 0;
            }
            if(count == 3){
                return true;
            }
        }
        return false;
    }

}
